#pragma once
#ifndef social_h
#define social_h

/////////////////////////////////////////////////////////////////////////////
//平台的类型--start
/////////////////////////////////////////////////////////////////////////////
typedef NS_ENUM(NSInteger,SocialPlatformType)
{
    SocialPlatformType_GameCenter         = 0,// GameCenter
    SocialPlatformType_Wechat             = 1,// 微信聊天
    SocialPlatformType_Facebook           = 2,// Facebook
    SocialPlatformType_GooglePlay         = 3,// GooglePlay
};

@interface SocialResponse : NSObject

@property (nonatomic, copy) NSString  *openId;
@property (nonatomic, copy) NSString  *refreshToken;
@property (nonatomic, copy) NSDate    *expiration;
@property (nonatomic, copy) NSString  *accessToken;

@property (nonatomic, assign) SocialPlatformType  platformType;
/**
 * 第三方原始数据
 */
@property (nonatomic, strong) id  originalResponse;

/**
 6.5版版本新加入的扩展字段
 */
@property (nonatomic, strong)NSDictionary* extDic;//每个平台特有的字段有可能会加在此处，有可能为nil

@end

@interface SocialShareResponse : SocialResponse

@property (nonatomic, copy) NSString  *message;
@end

@interface SocialAuthResponse : SocialResponse
@property (nonatomic, copy) NSString  *code;
@property (nonatomic, copy) NSString  *state;

@end

@interface SocialUserInfoResponse : SocialResponse

/**
 第三方平台昵称
 */
@property (nonatomic, copy) NSString  *nickName;

/**
 第三方平台头像地址
 */
@property (nonatomic, copy) NSString  *avatar;

@property (nonatomic, copy) NSString  *gender;

@end

/**
 *  授权，分享，UserProfile等操作的回调
 *
 *  @param result 表示回调的结果
 *  @param error  表示回调的错误码
 */
typedef void (^SocialRequestCompletionHandler)(id result,NSError *error);

/**
 *  授权，分享，UserProfile等操作的回调
 *
 *  @param shareResponse 表示回调的结果
 *  @param error  表示回调的错误码
 */
typedef void (^SocialShareCompletionHandler)(id shareResponse,NSError *error);

/**
 *  授权，分享，UserProfile等操作的回调
 *
 *  @param authResponse 表示回调的结果
 *  @param error  表示回调的错误码
 */
typedef void (^SocialAuthCompletionHandler)(id authResponse,NSError *error);


/////////////////////////////////////////////////////////////////////////////
//平台的类型--end
/////////////////////////////////////////////////////////////////////////////

@interface SocialMessageObject : NSObject

/**
 * text 文本内容
 * @note 非纯文本分享文本
 */
@property (nonatomic, copy) NSString  *title;

/**
 * 分享的所媒体内容对象
 */
@property (nonatomic, strong) id shareObject;

/**
 * 其他相关参数，见相应平台说明
 */
@property (nonatomic, strong) NSDictionary *moreInfo;

+ (SocialMessageObject *)messageObject;

@end


@interface ShareObject : NSObject

/**
 * 标题
 * @note 标题的长度依各个平台的要求而定
 */
@property (nonatomic, copy) NSString *title;

/**
 * 描述
 * @note 描述内容的长度依各个平台的要求而定
 */
@property (nonatomic, copy) NSString *description;

/**
 * 缩略图 UIImage或者NSData类型或者NSString类型（图片url）
 */
@property (nonatomic, strong) id thumbImage;

@end



@interface ShareImageObject : ShareObject

/** 图片内容 （可以是UIImage类对象，也可以是NSdata类对象，也可以是图片链接imageUrl NSString类对象）
 * @note 图片大小根据各个平台限制而定
 */
@property (nonatomic, retain) id shareImage;

@end

@interface ShareMusicObject : ShareObject

/** 音乐网页的url地址
 * @note 长度不能超过10K
 */
@property (nonatomic, retain) NSString *musicUrl;
/** 音乐lowband网页的url地址
 * @note 长度不能超过10K
 */
@property (nonatomic, retain) NSString *musicLowBandUrl;
/** 音乐数据url地址
 * @note 长度不能超过10K
 */
@property (nonatomic, retain) NSString *musicDataUrl;

/**音乐lowband数据url地址
 * @note 长度不能超过10K
 */
@property (nonatomic, retain) NSString *musicLowBandDataUrl;

@end


@interface ShareVideoObject : ShareObject

/**
 视频网页的url
 
 @warning 不能为空且长度不能超过255
 */
@property (nonatomic, strong) NSString *videoUrl;

/**
 视频lowband网页的url
 
 @warning 长度不能超过255
 */
@property (nonatomic, strong) NSString *videoLowBandUrl;

/**
 视频数据流url
 
 @warning 长度不能超过255
 */
@property (nonatomic, strong) NSString *videoStreamUrl;

/**
 视频lowband数据流url
 
 @warning 长度不能超过255
 */
@property (nonatomic, strong) NSString *videoLowBandStreamUrl;


@end


@interface ShareWebpageObject : ShareObject

/** 网页的url地址
 * @note 不能为空且长度不能超过10K
 */
@property (nonatomic, retain) NSString *webpageUrl;

@end


#pragma mark - SAppExtendObject
/*! @brief 多媒体消息中包含的App扩展数据对象
 *
 * 第三方程序向微信终端发送包含ShareExtendObject的多媒体消息，
 * 微信需要处理该消息时，会调用该第三方程序来处理多媒体消息内容。
 * @note url，extInfo和fileData不能同时为空
 * @see ShareObject
 */
@interface ShareExtendObject : ShareObject

/** 若第三方程序不存在，微信终端会打开该url所指的App下载地址
 * @note 长度不能超过10K
 */
@property (nonatomic, retain) NSString *url;
/** 第三方程序自定义简单数据，微信终端会回传给第三方程序处理
 * @note 长度不能超过2K
 */
@property (nonatomic, retain) NSString *extInfo;
/** App文件数据，该数据发送给微信好友，微信好友需要点击后下载数据，微信终端会回传给第三方程序处理
 * @note 大小不能超过10M
 */
@property (nonatomic, retain) NSData   *fileData;

@end


#pragma mark - FileObject
/*! @brief 多媒体消息中包含的文件数据对象
 *
 * @see ShareObject
 */
@interface ShareFileObject : ShareObject

/** 文件后缀名
 * @note 长度不超过64字节
 */
@property (nonatomic, retain) NSString  *fileExtension;

/** 文件真实数据内容
 * @note 大小不能超过10M
 */
@property (nonatomic, retain) NSData    *fileData;


@end



/*! @brief 多媒体消息中包含 分享微信小程序的数据对象
 *
 * @see ShareObject
 */
@interface ShareMiniProgramObject : ShareObject

/**
 低版本微信网页链接
 */
@property (nonatomic, strong) NSString *webpageUrl;

/**
 小程序username
 */
@property (nonatomic, strong) NSString *userName;

/**
 小程序页面的路径
 */
@property (nonatomic, strong) NSString *path;

@end



/**
 *  每个平台的必须实现的协议
 */
@protocol SocialPlatformProvider <NSObject>

@optional
/**
 *  当前SocialPlatformProvider对应操作的SocialPlatformType
 */
@property(nonatomic,assign)SocialPlatformType socialPlatformType;

-(void)launch:(nullable NSDictionary *)launchOptions;
/**
 *  初始化平台
 *
 *  @param appKey      对应的appkey
 *  @param appSecret   对应的appSecret
 *  @param redirectURL 对应的重定向url
 *  @discuss appSecret和redirectURL如果平台必须要的话就传入，不需要就传入nil
 */
-(void)setAppKey:(NSString *)appKey
            withAppSecret:(NSString *)appSecret
          withRedirectURL:(NSString *)redirectURL;

/**
 *  授权
 *
 *  @param userInfo          用户的授权的自定义数据
 *  @param completionHandler 授权后的回调
 *  @discuss userInfo在有些平台可以带入，如果没有就传入nil.
 */
-(void)AuthorizeWithUserInfo:(NSDictionary *)userInfo
                withCompletionHandler:(SocialRequestCompletionHandler)completionHandler;

/**
 *  已授权状态
 *
 *  @param userInfo          用户的授权的自定义数据
 *  @param completionHandler 授权后的回调
 *  @discuss userInfo在有些平台可以带入，如果没有就传入nil.
 */
-(void)AuthorizedWithUserInfo:(NSDictionary *)userInfo
                withCompletionHandler:(SocialRequestCompletionHandler)completionHandler;


/**
 *  分享
 *
 *  @param object            分享的对象数据模型
 *  @param completionHandler 分享后的回调
 */
-(void)ShareWithObject:(SocialMessageObject *)object
          withCompletionHandler:(SocialRequestCompletionHandler)completionHandler;

/**
 *  排行榜
 *
 *  @param string            排行榜Key
 *  @param int               分值
 *  @param completionHandler 分享后的回调
 */
-(void)LeaderboardWith:(NSString *)key withValue:(int) value
          withCompletionHandler:(SocialRequestCompletionHandler)completionHandler;

/**
 *  成就
 *
 *  @param string            成就Key
 *  @param int               分值
 *  @param completionHandler 分享后的回调
 */
-(void)AchievementWith:(NSString *)key withValue:(int) value
          withCompletionHandler:(SocialRequestCompletionHandler)completionHandler;

/**
 *  获得从sso或者web端回调到本app的回调
 *
 *  @param url 第三方sdk的打开本app的回调的url
 *
 *  @return 是否处理  YES代表处理成功，NO代表不处理
 */
-(BOOL)handleOpenURL:(NSURL *)url;
-(BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
-(BOOL)handleOpenURL:(NSURL *)url options:(NSDictionary*)options;

-(BOOL)isInstall;
-(BOOL)isSupport;
-(BOOL)isLeaderboard;
-(BOOL)isAchievement;
@end

@interface SocialManager : NSObject

+(instancetype)defaultManager;

-(void)launch:(nullable NSDictionary *)launchOptions;
/**
 *  设置平台的appkey
 *
 *  @param platformType 平台类型 @see SocialPlatformType
 *  @param appKey       第三方平台的appKey（QQ平台为appID）
 *  @param appSecret    第三方平台的appSecret（QQ平台为appKey）
 *  @param redirectURL  redirectURL
 */
- (BOOL)setPlatform:(SocialPlatformType)platformType
            appKey:(NSString *)appKey
         appSecret:(NSString *)appSecret
       redirectURL:(NSString *)redirectURL;

/**
 *  获得从sso或者web端回调到本app的回调
 *
 *  @param url 第三方sdk的打开本app的回调的url
 *
 *  @return 是否处理  YES代表处理成功，NO代表不处理
 */
-(BOOL)handleOpenURL:(NSURL *)url;

/**
 *  获得从sso或者web端回调到本app的回调
 *
 *  @param url               第三方sdk的打开本app的回调的url
 *  @param sourceApplication 回调的源程序
 *  @param annotation        annotation
 *
 *  @return 是否处理  YES代表处理成功，NO代表不处理
 *
 *  @note 此函数在6.3版本加入
 */
-(BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

/**
 *  获得从sso或者web端回调到本app的回调
 *
 *  @param url     第三方sdk的打开本app的回调的url
 *  @param options 回调的参数
 *
 *  @return 是否处理  YES代表处理成功，NO代表不处理
 *
 *  @note 此函数在6.3版本加入
 */
-(BOOL)handleOpenURL:(NSURL *)url options:(NSDictionary*)options;


/**
 *  动态的增加用户自定义的PlatformProvider
 *
 *  @param platformProvider 必须实现SocialPlatformProvider
 *  @param platformType               平台类型 @see platformType platformType
 *
 *  @return YES代表返回成功,NO代表失败
 *  @disuss 在调用此函数前，必须先设置对应的平台的配置信息 @see - (BOOL)setPlaform:(SocialPlatformType)platformType appKey:(NSString *)appKey appSecret:(NSString *)appSecret redirectURL:(NSString *)redirectURL;
 */
-(BOOL)addPlatformProvider:(id<SocialPlatformProvider>)platformProvider
             withPlatformType:(SocialPlatformType)platformType;

/**
 *  获得对应的平台类型platformType的PlatformProvider
 *
 *  @param platformType 平台类型 @see platformType
 *
 *  @return 返回继承SocialPlatformProvider的handle
 */
-(id<SocialPlatformProvider>)platformProviderWithPlatformType:(SocialPlatformType)platformType;

/**
 *  平台是否安装
 *
 *  @param platformType 平台类型 @see SocialPlatformType
 *
 *  @return YES 代表安装，NO 代表未安装
 *  @note 调用前请检查是否配置好平台相关白名单: http://dev.umeng.com/social/ios/quick-integration#1_3
 *  在判断QQ空间的App的时候，QQApi判断会出问题
 */
-(BOOL) isInstall:(SocialPlatformType)platformType;

/**
 *  当前平台是否支持分享
 *
 *  @param platformType 平台类型 @see SocialPlatformType
 *
 *  @return YES代表支持，NO代表不支持
 */
-(BOOL) isSupport:(SocialPlatformType)platformType;

/**
 *  平台是否支持排行榜
 *
 *  @param platformType 平台类型 @see SocialPlatformType
 */
-(BOOL) isLeaderboard:(SocialPlatformType)platformType;

/**
 *  当前平台是否支持成就
 *
 *  @param platformType 平台类型 @see SocialPlatformType
 *
 *  @return YES代表支持，NO代表不支持
 */
-(BOOL) isAchievement:(SocialPlatformType)platformType;
/**
 *  授权平台
 *  @param platformType  平台类型 @see SocialPlatformType
 *  @param completion   回调
 */
- (void)authWithPlatform:(SocialPlatformType)platformType
              completion:(SocialRequestCompletionHandler)completion;

/**
 *  当前授权状态
 *  @param platformType  平台类型 @see SocialPlatformType
 *  @param completion   回调
 */
- (void)authStatusWithPlatform:(SocialPlatformType)platformType
              completion:(SocialRequestCompletionHandler)completion;


/**
 *  设置分享平台
 *
 *  @param platformType  平台类型 @see SocialPlatformType
 *  @param messageObject  分享的content @see SocialMessageObject
 *  @param completion   回调
 */
- (void)shareToPlatform:(SocialPlatformType)platformType
          messageObject:(SocialMessageObject *)messageObject
             completion:(SocialRequestCompletionHandler)completion;

/**
 *  设置排行榜
 *
 *  @param platformType  平台类型 @see SocialPlatformType
 *  @param completion   回调
 */
- (void)leaderboardToPlatform:(SocialPlatformType)platformType
          Key:(NSString *)key
          Value:(int) value
          completion:(SocialRequestCompletionHandler)completion;

/**
 *  设置成就
 *
 *  @param platformType  平台类型 @see SocialPlatformType
 *  @param completion   回调
 */
- (void)achievementToPlatform:(SocialPlatformType)platformType
          Key:(NSString *)key
          Value:(int) value
          completion:(SocialRequestCompletionHandler)completion;
@end


#endif /* social_h */
